Function.prototype.hybind = function (thisArg, ...args) {
  // 1.获取到真实需要调用的函数
  var fn = this

  // 2.绑定this
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window

  function proxyFn(...args2) {
    // 3.将函数放到thisArg中进行调用
    thisArg.fn = fn
    // 4.特殊:对两个传入的参数进行合并
    var finalArgs = [...args, ...args2]
    var result = thisArg.fn(...finalArgs)
    delete thisArg.fn

    // 4.返回结果
    return result

  }

  return proxyFn
}



function foo() {
  console.log('foo被执行', this);
}

function sum(num1, num2, num3, num4) {
  console.log(num1, num2, num3, num4);
}

// 系统的bind使用
// var bar = foo.bind('abc')
// bar()

// var newSum = sum.bind('aaa', 10, 20, 30, 40)
// newSum()

// var newSum = sum.bind('aaa')
// newSum(10, 20, 30, 40)

// var newSum = sum.bind('aaa', 10, 20)
// newSum(30, 40)


// 使用自己定义的hybind
// var bar = foo.hybind('abc')
// var result = bar()
// console.log(result);

var newSum = sum.hybind('abc', 10, 20)
var result = newSum(30, 40)